package com.example.service.impl;

import com.example.common.CustomException;
import com.example.dao.*;
import com.example.entity.*;
import com.example.service.OrdermsgService;
import com.example.util.CheckCode;
import com.example.util.Savesession;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;

/**
 * 订单服务实现类
 */
@Service
public class OrdermsgServiceImpl implements OrdermsgService {

    @Resource
    private OrdermsgDao ordermsgDao;
    
    @Resource
    private MemberDao memberDao;
    
    @Resource
    private CartDao cartDao;
    
    @Resource
    private GoodsDao goodsDao;
    
    @Resource
    private Savesession savesession;
    
    @Resource
    private InventoryDao inventoryDao;
    
    @Resource
    private OrderdateilDao orderdateilDao;

    @Override
    public PageInfo<Ordermsg> getOrdermsgList(Integer pageNum, Integer pageSize, String key, String key1, String memberid) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("key", key);
        map.put("key1", key1);
        map.put("memberid", memberid);
        
        PageHelper.startPage(pageNum, pageSize);
        List<Ordermsg> list = ordermsgDao.selectAll(map);
        
        // 填充会员信息
        for (Ordermsg ordermsg : list) {
            Member member = memberDao.findById(ordermsg.getMemberid());
            ordermsg.setMember(member);
            ordermsg.setMembername(member.getUsername() + " / " + member.getName());
        }
        
        return new PageInfo<>(list);
    }

    @Override
    @Transactional
    public void addOrdermsg(Ordermsg ordermsg, String vals) {
        // 生成订单编号
        CheckCode ch = new CheckCode();
        String orderno = ch.getCheckCode();
        
        String[] val = vals.split(",");
        Double total = 0.0;
        String productmsg = "<div>";
        
        // 处理购物车中的商品
        for (int i = 0; i < val.length; i++) {
            Cart cart = cartDao.findById(Integer.parseInt(val[i]));
            Goods goods = goodsDao.findById(cart.getGoodsid());
            
            // 添加订单详情
            Orderdateil orderdateil = new Orderdateil();
            Double price = 0.0;
            
            if ("是".equals(goods.getIsdiscount())) {
                price = goods.getDiscountprice();
            } else {
                price = goods.getPrice();
            }
            
            orderdateil.setPrice(price);
            orderdateil.setTotal(price * cart.getSlnum());
            total += price * cart.getSlnum();
            
            orderdateil.setOrderno(orderno);
            orderdateil.setGoodsid(goods.getId());
            orderdateil.setSlnum(cart.getSlnum());
            
            orderdateil.setStatus("待付款");
            orderdateilDao.add(orderdateil);
            
            // 构建商品信息
            productmsg += "<div style='margin-top:10px;'>" + goods.getName() + " × " + cart.getSlnum() + "</div>";
            
            // 删除购物车中的商品
            cartDao.delete(cart.getId());
        }
        
        productmsg += "</div>";
        
        // 设置订单信息
        ordermsg.setOrderno(orderno);
        ordermsg.setGoodsname(productmsg);
        ordermsg.setTotal(total);
        
        // 保存订单
        ordermsgDao.add(ordermsg);
    }

    @Override
    @Transactional
    public void shipOrder(Ordermsg ordermsg) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("orderno", ordermsg.getOrderno());
        List<Orderdateil> list = orderdateilDao.selectAll(map);
        
        boolean flag = true;
        
        // 检查库存并更新订单详情状态
        for (Orderdateil orderdateil : list) {
            // 判断菜品库存数量
            int kc = savesession.getInventory(orderdateil.getGoodsid(), null);
            if (kc < orderdateil.getSlnum()) {
                flag = false;
                break;
            }
            orderdateil.setStatus("交易完成");
            orderdateilDao.update(orderdateil);
        }
        
        if (flag) {
            // 更新订单状态
            ordermsg.setStatus("交易完成");
            ordermsgDao.update(ordermsg);
            
            // 减掉已发货菜品库存
            for (Orderdateil orderdateil : list) {
                Inventory inventory = new Inventory();
                inventory.setFlag("out");
                inventory.setGoodsid(orderdateil.getGoodsid());
                inventory.setNum(orderdateil.getSlnum());
                inventoryDao.add(inventory);
            }
        } else {
            throw new CustomException("操作失败，有菜品库存不足");
        }
    }

    @Override
    @Transactional
    public void confirmOrder(Ordermsg ordermsg) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("orderno", ordermsg.getOrderno());
        List<Orderdateil> list = orderdateilDao.selectAll(map);
        
        // 更新订单详情状态
        for (Orderdateil orderdateil : list) {
            orderdateil.setStatus("交易完成");
            orderdateilDao.update(orderdateil);
        }
        
        // 更新订单状态
        ordermsgDao.update(ordermsg);
    }

    @Override
    @Transactional
    public void deleteOrdermsg(int id) {
        Ordermsg ordermsg = ordermsgDao.findById(id);
        
        // 删除订单详情
        HashMap<String, Object> map = new HashMap<>();
        map.put("orderno", ordermsg.getOrderno());
        List<Orderdateil> list = orderdateilDao.selectAll(map);
        for (Orderdateil orderdateil : list) {
            orderdateilDao.delete(orderdateil.getId());
        }
        
        // 删除订单
        ordermsgDao.delete(id);
    }

    @Override
    @Transactional
    public void batchDeleteOrdermsg(String vals) {
        String[] val = vals.split(",");
        for (String id : val) {
            // 删除订单详情信息
            Ordermsg ordermsg = ordermsgDao.findById(Integer.parseInt(id));
            HashMap<String, Object> map = new HashMap<>();
            map.put("orderno", ordermsg.getOrderno());
            List<Orderdateil> list = orderdateilDao.selectAll(map);
            for (Orderdateil orderdateil : list) {
                orderdateilDao.delete(orderdateil.getId());
            }
            
            // 删除订单
            ordermsgDao.delete(Integer.parseInt(id));
        }
    }

    @Override
    public List<Ordermsg> getSalesStatistics(String status) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("status", status);
        return ordermsgDao.selectTj(map);
    }
} 